package gcp.testes;

import static org.junit.Assert.assertEquals;
import gcp.Filme;
import gcp.enums.ClassificacaoEtaria;
import gcp.enums.GeneroFilme;
import gcp.enums.ItemEstado;

import org.junit.Before;
import org.junit.Test;

/**
 * Classe de teste de Filme
 */
public class FilmeTeste {
	private Filme filme1, filme2, filme3, filme4;

	/**
	 * Criacao das variaveis.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Before
	public void setUp() throws Exception {
		filme1 = new Filme("Debi & Lóide", "Playarte", 1994, ClassificacaoEtaria.LIVRE, ItemEstado.COMIGO, GeneroFilme.POLICIAL,"bom");
		filme2 = new Filme("Inglourious Bastards", "Universal Pictures", 2009 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.EPICO, "legal");
		filme3 = new Filme("The Curious Case of Benjamin Button", "Kennedy/Marshall", 2008 , ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DRAMA,"Muito lindo");
		filme4 = new Filme("Batman - The Dark Knight", "Warner Bros.", 2005 , ClassificacaoEtaria.DOZE , ItemEstado.A_DEVOLVER, GeneroFilme.ACAO, "maneiro");
	}

	/**
	 * Criacao de filme com titulo nulo.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaTituloNull() throws Exception {
		new Filme(null, "Universal Pictures", 2009 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.GUERRA,"");
		new Filme("The Curious Case of Benjamin Button", "Kennedy/Marshall", 2008 , ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DRAMA, null);
	}

	/**
	 * Criacao de filme com titulo vazio.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaTituloVazio() throws Exception {
		new Filme("Inglourious Bastards", "Universal Pictures", 2009 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.GUERRA, null);
		new Filme("", "Kennedy/Marshall", 2008 , ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DRAMA,null);
	}

	/**
	 * Criacao de filme com quem publicou nulo.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaQuemPublicouNulo() throws Exception {
		new Filme("Inglourious Bastards", "Universal Pictures", 2009 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.GUERRA, "");
		new Filme("The Curious Case of Benjamin Button", null, 2008 , ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DOCUMENTARIO, "Tosco");;
	}

	/**
	 * Criacao de filme com quem publicou vazio.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaQuemPublicouVazio() throws Exception {
		new Filme("Inglourious Bastards", "", 2009 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.GUERRA, "Violento");
		new Filme("The Curious Case of Benjamin Button", "Kennedy/Marshall", 2008 , ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DRAMA,"Interessante");
	}

	/**
	 * Criacao de filme com ano zero.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaAnoZero() throws Exception {
		new Filme("Inglourious Bastards", "Universal Pictures", 0 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.GUERRA, "Sanguinolento");
		new Filme("The Curious Case of Benjamin Button", "Kennedy/Marshall", 2008 , ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DRAMA, "Brad Pitt � um gato");
	}
	
	/**
	 * Criacao de filme com ano negativo.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test(expected = Exception.class)
	public void testaAnoNegativo() throws Exception {
		new Filme("Inglourious Bastards", "Universal Pictures", 2009 , ClassificacaoEtaria.DEZOITO , ItemEstado.FALTANDO, GeneroFilme.GUERRA,"Mentiroso");
		new Filme("The Curious Case of Benjamin Button", "Kennedy/Marshall", -23, ClassificacaoEtaria.QUARTOZE , ItemEstado.COMIGO, GeneroFilme.DRAMA, "Mais parece fica��o cientifica");
	}

	/**
	 * Testa o metodo getTitulo.
	 */
	@Test
	public void testaGetTitulos() {
		assertEquals("Debi & Lóide", filme1.getTitulo());
		assertEquals("Inglourious Bastards", filme2.getTitulo());
		assertEquals("The Curious Case of Benjamin Button", filme3.getTitulo());
		assertEquals("Batman - The Dark Knight", filme4.getTitulo());
	}

	/**
	 * Testa o metodo setTitulo.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	public void testaSetEGetNomes() throws Exception {
		filme1.setTitulo("Loucademia de Policia");
		filme2.setTitulo("O pianista");
		filme3.setTitulo("Filhos da Esperança");
		filme4.setTitulo("Deus é brasileiro");
		assertEquals("Loucademia de Policia", filme1.getTitulo());
		assertEquals("O pianista", filme2.getTitulo());
		assertEquals("Filhos da Esperança", filme3.getTitulo());
		assertEquals("Deus é brasileiro", filme4.getTitulo());
	}

	/**
	 * Testa o metodo quemPublicou
	 */
	@Test
	public void testagetQuemPublicou() {
		assertEquals("Playarte", filme1.getQuemPublicou());
		assertEquals("Universal Pictures", filme2.getQuemPublicou());
		assertEquals("Kennedy/Marshall", filme3.getQuemPublicou());
		assertEquals("Warner Bros.", filme4.getQuemPublicou());
	}

	/**
	 * Testa os metodos setQuemPublicou e getQuemPublicou
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	public void testaSetEGetQuemPublicou() throws Exception {
		filme1.setQuemPublicou("Globo");
		filme2.setQuemPublicou("SBT");
		filme3.setQuemPublicou("Record");
		filme4.setQuemPublicou("Band");
		assertEquals("Globo", filme1.getQuemPublicou());
		assertEquals("SBT", filme2.getQuemPublicou());
		assertEquals("Record", filme3.getQuemPublicou());
		assertEquals("Band", filme4.getQuemPublicou());
	}
	
	/**
	 * Testa o metodo getAno
	 */
	@Test
	public void testaGetAno() {
		assertEquals(1994, filme1.getAno());
		assertEquals(2009, filme2.getAno());
		assertEquals(2008, filme3.getAno());
		assertEquals(2005, filme4.getAno());
	}

	/**
	 * Testa os metodos setAno e getAno
	 * @throws Exception 
	 */
	@Test
	public void testaSetEGetAno() throws Exception {
		filme1.setAno(1960);
		filme2.setAno(1970);
		filme3.setAno(1980);
		filme4.setAno(1990);
		assertEquals(1960, filme1.getAno());
		assertEquals(1970, filme2.getAno());
		assertEquals(1980, filme3.getAno());
		assertEquals(1990, filme4.getAno());
	}
	
	/**
	 * Testa o metodo getEsrb
	 */
	@Test
	public void testaGetERSB() {
		assertEquals(ClassificacaoEtaria.LIVRE, filme1.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.DEZOITO, filme2.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.QUARTOZE, filme3.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.DOZE, filme4.getClassificacaoEtaria());
	}

	/**
	 * Testa os metodos setIdade e getIdade.
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	public void testaSetEGetIdade() throws Exception {
		filme1.setClassificacaoEtaria(ClassificacaoEtaria.DESCONHECIDO);
		filme2.setClassificacaoEtaria(ClassificacaoEtaria.DEZESSEIS);
		filme3.setClassificacaoEtaria(ClassificacaoEtaria.LIVRE);
		filme4.setClassificacaoEtaria(ClassificacaoEtaria.DEZOITO);
		assertEquals(ClassificacaoEtaria.DESCONHECIDO, filme1.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.DEZESSEIS, filme2.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.LIVRE, filme3.getClassificacaoEtaria());
		assertEquals(ClassificacaoEtaria.DEZOITO, filme4.getClassificacaoEtaria());
	}

	/**
	 * Testa o metodo getItemEstado
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaItemEstado() throws Exception {
	    assertEquals(ItemEstado.COMIGO, filme1.getItemEstado());
		assertEquals(ItemEstado.FALTANDO, filme2.getItemEstado());
		assertEquals(ItemEstado.COMIGO, filme3.getItemEstado());
		assertEquals(ItemEstado.A_DEVOLVER, filme4.getItemEstado());
	 }

	/**
	 * Testa os metodos setItemEstado e getItemEstado
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaSetEGetItemEstado() throws Exception {
	 	filme1.setItemEstado(ItemEstado.EMPRESTADO);
		filme2.setItemEstado(ItemEstado.COMIGO);
		filme3.setItemEstado(ItemEstado.A_DEVOLVER);
		filme4.setItemEstado(ItemEstado.FALTANDO);
		assertEquals(ItemEstado.EMPRESTADO, filme1.getItemEstado());
		assertEquals(ItemEstado.COMIGO, filme2.getItemEstado());
		assertEquals(ItemEstado.A_DEVOLVER, filme3.getItemEstado());
		assertEquals(ItemEstado.FALTANDO, filme4.getItemEstado());
	 }
	
	/**
	 * Testa o metodo getGeneroFilme
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */ 
	@Test
	 public void testaGetGeneroFilme() throws Exception {
	    assertEquals(GeneroFilme.POLICIAL, filme1.getGenero());
		assertEquals(GeneroFilme.EPICO, filme2.getGenero());
		assertEquals(GeneroFilme.DRAMA, filme3.getGenero());
		assertEquals(GeneroFilme.ACAO, filme4.getGenero());
	 }

	/**
	 * Testa os metodos setEmail e getEmail
	 * @throws Exception Lancada quando algum parametro for invalido.
	 */
	@Test
	 public void testaSetEGetEmail() throws Exception {
	 	filme1.setGenero(GeneroFilme.MUSICAL);
		filme2.setGenero(GeneroFilme.DOCUMENTARIO);
		filme3.setGenero(GeneroFilme.FAROESTE);
		filme4.setGenero(GeneroFilme.TERROR);
		assertEquals(GeneroFilme.MUSICAL, filme1.getGenero());
		assertEquals(GeneroFilme.DOCUMENTARIO, filme2.getGenero());
		assertEquals(GeneroFilme.FAROESTE, filme3.getGenero());
		assertEquals(GeneroFilme.TERROR, filme4.getGenero());
	}
}